﻿using System;
namespace ttt.kontrakte {
public partial class Neues_Spiel_beginnen : INeues_Spiel_beginnen {
  public event Action<Spielstand> Out_NeuesSpiel;

private Action _In_Process;
  public void In_Process() {
    _In_Process();
  }
  public Neues_Spiel_beginnen(Repo<Spielstand> Repo) {
    this._In_Process += Repo.Create;
    Repo.Created += m => this.Out_NeuesSpiel(m);
  }
}

}
namespace ttt.kontrakte {
public interface INeues_Spiel_beginnen {
  event Action<Spielstand> Out_NeuesSpiel;
void In_Process();}
public interface IFrontend {
  event Action<Zug> Out_Spieler_zieht;
event Action Out_Neues_Spiel;  void In_GeänderterSpielstand(Spielstand message);
  void In_UngültigerZug(Spielstand message);
}
public interface ISpieler_zieht {
  event Action<Spielstand> Out_NeuerSpielstand;
  event Action<Spielstand> Out_UngültigerZug;
  void In_Process(Zug message);
}
public interface IHauptplatine {
void Run();}
public partial class Hauptplatine : IHauptplatine {

private Action _Run;
  public void Run() {
    _Run();
  }
  public Hauptplatine(INeues_Spiel_beginnen Neues_Spiel_beginnen, IFrontend Frontend, ISpieler_zieht Spieler_zieht) {
    this._Run += Neues_Spiel_beginnen.In_Process;
    Neues_Spiel_beginnen.Out_NeuesSpiel += Frontend.In_GeänderterSpielstand;
    Frontend.Out_Spieler_zieht += Spieler_zieht.In_Process;
    Spieler_zieht.Out_NeuerSpielstand += Frontend.In_GeänderterSpielstand;
    Spieler_zieht.Out_UngültigerZug += Frontend.In_UngültigerZug;
    Frontend.Out_Neues_Spiel += Neues_Spiel_beginnen.In_Process;
  }
}

}
